<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/wordpress-mu-1.2.5" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>procself &#187; open-source</title>
	<link>http://blogs.fe.up.pt/mpadilha</link>
	<description>cat /proc/self/cmdline</description>
	<pubDate>Wed, 14 Oct 2009 17:36:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=wordpress-mu-1.2.5</generator>
	<language>en</language>
			<item>
		<title>Remember Yesterday&#8230; Porto Cidade Linux</title>
		<link>http://blogs.fe.up.pt/mpadilha/2009/05/06/remember-yesterday-porto-cidade-linux/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2009/05/06/remember-yesterday-porto-cidade-linux/#comments</comments>
		<pubDate>Wed, 06 May 2009 11:40:06 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[procself]]></category>

		<category><![CDATA[open-source]]></category>

		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2009/05/06/remember-yesterday-porto-cidade-linux/</guid>
		<description><![CDATA[As coisas em que uma pessoa tropeça quando tenta reconstituir o passado&#8230;
Porto: Cidade Linux, Cidade Tecnológica 
e cá está a prova de que estive lá&#8230;

Partilhar
]]></description>
			<content:encoded><![CDATA[<p>As coisas em que uma pessoa tropeça quando tenta reconstituir o passado&#8230;</p>
<p><a href="http://reinolinux.org/cidadelinux/fotos.html">Porto: Cidade Linux, Cidade Tecnológica </a></p>
<p>e cá está a prova de que estive lá&#8230;</p>
<p><img src="http://reinolinux.org/cidadelinux/Fotos/2/picture-010.JPG" alt="Porto Cidade Linux (Fotografia #010 da Galeria 2)" vspace="10" width="463" align="absmiddle" border="0" height="347" hspace="0" /></p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=106&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_106" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2009/05/06/remember-yesterday-porto-cidade-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Non Default</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/12/31/non-default/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/12/31/non-default/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 16:42:01 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/12/31/non-default/</guid>
		<description><![CDATA[Há uns tempos atrás escrevi sobre a melhor forma de traduzir a expressão anglo-saxónica &#8220;By default&#8221; para português.
Para além da hipótese que eu favorecia na altura (&#8221;por omissão&#8221;) foi também sugerida aquela que uso agora com mais frequência: &#8220;por pré-definição&#8221;. Diz a Priberam que é esta a melhor opção de tradução.
Recentemente, enquanto ajudava na tradução [...]]]></description>
			<content:encoded><![CDATA[<p>Há uns tempos atrás <a href="http://blogs.fe.up.pt/mpadilha/2007/08/13/by-default/">escrevi</a> sobre a melhor forma de traduzir a expressão anglo-saxónica &#8220;By default&#8221; para português.</p>
<p>Para além da hipótese que eu favorecia na altura (&#8221;por omissão&#8221;) foi também sugerida aquela que uso agora com mais frequência: &#8220;por pré-definição&#8221;. Diz a <a href="http://www.flip.pt/tabid/325/Default.aspx?DID=1074">Priberam</a> que é esta a melhor opção de tradução.</p>
<p>Recentemente, enquanto ajudava na tradução do <a href="https://launchpad.net/drizzle">Drizzle</a> para português (se quiserem contribuir, é só dar um saltinho até <a href="https://translations.launchpad.net/drizzle/trunk/+pots/drizzle/pt/+translate">aqui</a>), surgiu-me uma dúvida relacionada. Como traduzir a expressão &#8220;non-default&#8221;? Aqui fica a frase em que a encontrei:</p>
<blockquote><p><em> <strong>Non-default</strong> option to alias SYSDATE() to NOW() to make it safe-replicable.</em></p></blockquote>
<p>Parece-me claro que não se pode usar nenhuma variante do &#8220;pré-definido&#8221; neste contexto, simplesmente não funciona. O significado dado à palavra &#8220;default&#8221;, neste caso específico, parece ser mais próximo de &#8220;standard&#8221; (uma vez que efectivamente se está a falar de uma opção que sai fora do standard SQL), pelo que faria mais sentido optar por &#8220;padrão&#8221; ou &#8220;norma&#8221; que são provavelmente as traduções mais comuns.</p>
<p>Seja como for não consigo encontrar uma tradução que me deixe satisfeito, excepto talvez a opção de traduzir só parcialmente e dizer &#8220;Opção não default (&#8230;)&#8221;.</p>
<p>O que fariam vocês?</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=98&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_98" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/12/31/non-default/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JBoss + Hibernate + MySQL sem perder ligações</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/11/28/jboss-hibernate-mysql-sem-perder-ligacoes/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/11/28/jboss-hibernate-mysql-sem-perder-ligacoes/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 10:29:58 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[mysql]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/11/28/jboss-hibernate-mysql-sem-perder-ligacoes/</guid>
		<description><![CDATA[Existem essencialmente duas formas distintas de usar Hibernate com MySQL (ou qualquer outra base-de-dados, para este ponto em concreto é indiferente), definindo todas as propriedades da ligação no próprio ficheiro de configuração do Hibernate, ou dizendo apenas que se pretende usar uma datasource JNDI pré-existente.
A primeira opção é a escolha típica numa aplicação stand-alone, mas [...]]]></description>
			<content:encoded><![CDATA[<p>Existem essencialmente duas formas distintas de usar Hibernate com MySQL (ou qualquer outra base-de-dados, para este ponto em concreto é indiferente), definindo todas as propriedades da ligação no próprio ficheiro de configuração do Hibernate, ou dizendo apenas que se pretende usar uma datasource JNDI pré-existente.</p>
<p>A primeira opção é a escolha típica numa aplicação stand-alone, mas a opção de utilizar uma datasource JNDI é a que faz mais sentido para <em>application servers</em>. Portanto, o ficheiro de configuração do Hibernate há-de ter, parcialmente, este aspecto:</p>
<p><code>&lt;hibernate-configuration&gt;<br />
&lt;session-factory&gt;<br />
&lt;property name="hibernate.connection.datasource"&gt;<br />
java:my_app_name<br />
&lt;/property&gt;<br />
&lt;property name="hibernate.setup"&gt;true&lt;/property&gt;<br />
&lt;property name="hibernate.dialect"&gt;<br />
org.hibernate.dialect.MySQLInnoDBDialect<br />
&lt;/property&gt;<br />
&lt;property name="transaction.factory_class"&gt;<br />
org.hibernate.transaction.JDBCTransactionFactory<br />
&lt;/property&gt;<br />
&lt;property name="current_session_context_class"&gt;<br />
thread<br />
&lt;/property&gt;<br />
&lt;/session-factory&gt;<br />
&lt;/hibernate-configuration&gt;</code></p>
<p>Depois basta definir a datasource com o nome JNDI correspondente, por exemplo assim:</p>
<p><code>&lt;datasources&gt;<br />
&lt;local-tx-datasource&gt;<br />
&lt;jndi-name&gt;my_app_name&lt;/jndi-name&gt;<br />
&lt;connection-url&gt;jdbc:mysql://host_or_ip/db_name&lt;/connection-url&gt;<br />
&lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;<br />
&lt;user-name&gt;username&lt;/user-name&gt;<br />
&lt;password&gt;password&lt;/password&gt;<br />
&lt;min-pool-size&gt;5&lt;/min-pool-size&gt;<br />
&lt;max-pool-size&gt;20&lt;/max-pool-size&gt;<br />
&lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</code></p>
<p>Agora que está tudo montado como manda a documentação, sugiro uma experiência:</p>
<ol>
<li>Ligar servidor BD.</li>
<li>Ligar application server.</li>
<li>Testar aplicação que se liga à base de dados (funciona)</li>
<li>Reiniciar servidor BD (ou esperar 8 horas).</li>
<li>Testar aplicação que se liga à base de dados (não funciona!)</li>
</ol>
<p>Então&#8230; tanto trabalho para abstrair a ligação a base de dados e um simples restart da base de dados deixa as ligações geridas pelo Hibernate todas inválidas? E, pior, não há recuperação automática?</p>
<p>Pois&#8230; parece que não. E acrescentar o parâmetro <code>autoReconnect=true</code> ao URL JDBC também não resolve, aliás, a utilização desse parâmetro até é desaconselhada, como se pode ver pelo que diz no manual:</p>
<blockquote><p>Should the driver try to re-establish stale and/or dead connections? If enabled the driver will throw an exception for a queries issued on a stale or dead connection, which belong to the current transaction, but will attempt reconnect before the next query issued on the connection in a new transaction. The use of this feature is not recommended, because it has side effects related to session state and data consistency when applications don&#8217;t handle SQLExceptions properly, and is only designed to be used when you are unable to configure your application to handle SQLExceptions resulting from dead and stale connections properly. &#8212; <a href="http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html">MySQL 5.0 Reference Manual</a></p></blockquote>
<p>A solução que encontrei para MySQL (e que também funciona para MS SQL Server), é acrescentar a seguinte linha ao ficheiro de configuração da datasource:</p>
<p><code>&lt;check-valid-connection-sql&gt;SELECT 1&lt;/check-valid-connection-sql&gt;</code></p>
<p>Esta opção faz mesmo aquilo que parece fazer, ou seja, antes de usar uma ligação, a query ali especificada é executada como forma de verificar se a ligação é usável. Se não ocorrer nenhum erro, a instrução SQL que realmente se pretende executar é enviada pela mesma ligação, se houver um erro, a ligação é descartada e é criada uma nova.</p>
<p>Claro que isto tem um impacto sério na performance uma vez que se está a duplicar o número de queries, o que pode ser particularmente grave se o acesso à base de dados for feito através de um canal de elevada latência (rede, por exemplo).</p>
<p>Aparentemente existem soluções melhores para outras bases de dados, como o seguinte comentário parece sugerir:</p>
<p class="post-text">&nbsp;</p>
<blockquote><p>Whilst you can use the old &#8220;select 1 from dual&#8221; trick, the downside with this is that it issues an extra query each and every time you borrow a connection from the pool. For high volumes, this is wasteful.</p>
<p>JBoss provides a special connection validator which should be used for Oracle:</p>
<p>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</p>
<p>This makes use of the proprietary ping() method on the Oracle JDBC Connection class, and uses the driver&#8217;s underlying networking code to determine if the connection is still alive. &#8212; <a href="http://stackoverflow.com/questions/128527/is-there-any-way-to-have-the-jboss-connection-pool-reconnect-to-oracle-when-con#145889">stackoverflow.com</a></p></blockquote>
<p>Alguém conhece uma alternativa semelhante para MySQL?</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=96&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_96" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/11/28/jboss-hibernate-mysql-sem-perder-ligacoes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Profilling - TPTP</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 16:45:09 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[performance]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/</guid>
		<description><![CDATA[Cada vez mais me convenço que, logo a seguir a um debugger, uma ferramenta de profiling é das mais importantes para quem desenvolve software.A minha mais recente descoberta é precisamente um profiler para aplicações Java desenvolvidas em (e/ou para) Eclipse. Chama-se TPTP, que é acrónimo para Testing and Performance Tools Platform, e foi um bocadinho difícil de pôr [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez mais me convenço que, logo a seguir a um debugger, uma ferramenta de <a href="http://en.wikipedia.org/wiki/Performance_analysis">profiling</a> é das mais importantes para quem desenvolve software.A minha mais recente descoberta é precisamente um <span class="Apple-style-span">profiler</span> para aplicações Java desenvolvidas em (e/ou para) Eclipse. Chama-se <a href="http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html">TPTP</a>, que é acrónimo para Testing and Performance Tools Platform, e foi um bocadinho difícil de pôr a funcionar em Vista por causa do <a href="http://technet.microsoft.com/en-us/library/cc709691.aspx">UAC</a>, mas valeu bem o esforço.Esta ferramenta permite analisar com muito detalhe a utilização de CPU. Dá para fazer <span class="Apple-style-span">drill-down</span> por package, classe e método; ver tempos gastos em cada nível da <span class="Apple-style-span">call stack</span>, ou acumulados daí para baixo; e até desenhar gráficos de chamadas e dependências (que me parecem pouco úteis para projectos já com alguma dimensão, mas enfim).Não explorei muito as capacidades de <span class="Apple-style-span">Memory Analysis</span>, porque não era o mais relevante para o projecto em causa, mas também estão lá. Só a <span class="Apple-style-span">performance</span> de rede é que não está contemplada nesta plataforma, mas para isso existem o <a href="http://jakarta.apache.org/jmeter/">JMeter</a> (se for HTTP) e o <a href="http://www.wireshark.org/">Wireshark</a> (em todos os outros casos), que fazem muito bem o seu trabalho. </p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=92&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_92" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/09/03/java-profilling-tptp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Eclipse P2</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/08/20/eclipse-p2/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/08/20/eclipse-p2/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 11:20:49 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/08/20/eclipse-p2/</guid>
		<description><![CDATA[Apenas uma nota muito rápida sobre a mais recente versão do Eclipse: Ganymede.
Uma das novidades é o novo sistema de actualizações de plugins e features, o P2. Vale a pena ler este artigo, sobretudo para quem desenvolve plugins para o dito.
Partilhar
]]></description>
			<content:encoded><![CDATA[<p>Apenas uma nota muito rápida sobre a mais recente versão do Eclipse: <a href="http://www.eclipse.org/ganymede/">Ganymede</a>.</p>
<p>Uma das novidades é o novo sistema de actualizações de <em>plugins </em>e <em>features</em>, o P2. Vale a pena ler <a href="http://wiki.eclipse.org/Equinox_p2_Getting_Started">este artigo</a>, sobretudo para quem desenvolve <em>plugins </em>para o dito.</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=91&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_91" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/08/20/eclipse-p2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenWRT - DNSMasq forwarding</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/02/18/openwrt-dnsmasq-forwarding/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/02/18/openwrt-dnsmasq-forwarding/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 18:22:47 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[open-source]]></category>

		<category><![CDATA[networking]]></category>

		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/02/18/openwrt-dnsmasq-forwarding/</guid>
		<description><![CDATA[Troquei recentemente o router lá de casa por um Asus WL-500G Premium.
Pretendia usá-lo como router/access point convencional, mas também como:

 print server - para uma HP com interface USB;
file server - usando como dispositivo de armazenamento uma pen ou disco usb externo;
ipsec gateway - para estabelecer uma VPN com a firewall corporativa e permitir acesso [...]]]></description>
			<content:encoded><![CDATA[<p>Troquei recentemente o router lá de casa por um <a href="http://www.asus.com/products.aspx?l1=12&amp;l2=43&amp;l3=0&amp;model=1121&amp;modelmenu=1">Asus WL-500G Premium</a>.</p>
<p>Pretendia usá-lo como router/access point convencional, mas também como:</p>
<ul>
<li> <strong>print server</strong> - para uma HP com interface USB;</li>
<li><strong>file server</strong> - usando como dispositivo de armazenamento uma pen ou disco usb externo;</li>
<li><strong>ipsec gateway</strong> - para estabelecer uma VPN com a firewall corporativa e permitir acesso aos PCs lá de casa;</li>
</ul>
<p>Tudo isto podia ser conseguido com o firmware original do router, excepto a parte do ipsec. Como também tinha alguma curiosidade em instalar Linux em sistemas &#8220;embedded&#8221;, resolvi  experimentar.</p>
<p>A primeira tentativa foi com o <a href="http://www.dd-wrt.com/">DD-WRT</a>, mas não gostei do sistema de ficheiros read-only, nem do <em>feel</em> da coisa. A segunda tentativa foi com o <a href="http://openwrt.org/">OpenWRT</a>, e desta vez fiquei satisfeito. A documentação existente no <a href="http://wiki.openwrt.org/">wiki</a> é francamente boa, tanto no que diz respeito aos procedimentos de instalação, como também à configuração e afinação final.</p>
<p>Consegui completar todos os objectivos traçados recorrendo à documentação existente no wiki, com excepção de um pequeno pormenor. Depois de estabelecida a VPN com a firewall corporativa, dá muito jeito que as queries DNS para o domínio interno da rede corporativa sejam enviadas através da VPN até aos servidores responsáveis pela zona. O <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html">DNSMasq</a> tal como vem instalado só permite encaminhar todas as queries para um (ou mais servidores), ou resolvê-las a partir dos root servers. Parecia não haver forma de fazer um encaminhamento selectivo de queries de certos domínios para um (ou mais servidores) de DNS.</p>
<p>Acabei por descobrir a solução na <a href="http://downloads.openwrt.org/people/nico/man/man8/dnsmasq.8.html">manpage do DNSMasq</a>. Há um switch que permite definir exactamente isso:</p>
<blockquote><p>-S /private.domain/w.x.y.z</p></blockquote>
<p>Acrescentando este switch à variável <code>args</code> do script de arranque em <code>/etc/init.d/dnsmasq</code> consegue-se que o router encaminhe todas as queries de DNS para a zona <code>private.domain</code> para o servidor de DNS com o endereço <code>w.x.y.z</code>.</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=68&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_68" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/02/18/openwrt-dnsmasq-forwarding/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Clone database schema</title>
		<link>http://blogs.fe.up.pt/mpadilha/2008/01/09/mysql-clone-database-schema/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2008/01/09/mysql-clone-database-schema/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 14:52:30 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[mysql]]></category>

		<category><![CDATA[open-source]]></category>

		<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2008/01/09/mysql-clone-database-schema/</guid>
		<description><![CDATA[Neste artigo descobri uma forma de criar tabelas que dá muito jeito:
CREATE TABLE newtable LIKE mytable;
Pensei que devia existir algo equivalente para copiar as definições de uma base de dados inteira, mas aparentemente não existe.
A forma mais fácil de conseguir o mesmo resultado é provavelmente usar o mysqldump com a seguinte opção:

--no-data

No entanto, já há [...]]]></description>
			<content:encoded><![CDATA[<p>Neste <a href="http://www.phpdiary.org/articles/how-to-clone-a-mysql-table-schema/">artigo</a> descobri uma forma de criar tabelas que dá muito jeito:</p>
<blockquote><p><code>CREATE TABLE newtable LIKE mytable;</code></p></blockquote>
<p>Pensei que devia existir algo equivalente para copiar as definições de uma base de dados inteira, mas aparentemente não existe.<br />
A forma mais fácil de conseguir o mesmo resultado é provavelmente usar o <a href="http://dev.mysql.com/doc/mysql/en/mysqldump.html">mysqldump</a> com a seguinte opção:</p>
<blockquote>
<pre>--no-data</pre>
</blockquote>
<p>No entanto, já há bastante tempo que queria experimentar os <em>stored procedures</em> do MySQL, por isso aproveitei a oportunidade para escrever o meu primeiro:</p>
<blockquote><p><code> delimiter //</code><br />
<code> DROP PROCEDURE IF EXISTS copySchema //</code><br />
<code> CREATE PROCEDURE copySchema(IN schemaname CHAR(64))</code><br />
<code> BEGIN</code><br />
<code> DECLARE done INT DEFAULT 0;</code><br />
<code> DECLARE table_a CHAR(64) default 'testing';</code><br />
<code> DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA = schemaname;</code><br />
<code> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;</code><br />
<code> OPEN cur1;</code><br />
<code> REPEAT</code><br />
<code> FETCH cur1 INTO table_a;</code><br />
<code> IF NOT done THEN</code><br />
<code> SELECT CONCAT('CREATE TABLE ', table_a, ' LIKE ', schemaname, '.', table_a) into @sqlstr;</code><br />
<code> PREPARE stmt FROM @sqlstr;</code><br />
<code> EXECUTE stmt;</code><br />
<code> END IF;</code><br />
<code> UNTIL done END REPEAT;</code><br />
<code> CLOSE cur1;</code><br />
<code> END</code><br />
<code> //</code><br />
<code> delimiter ;</code><br />
<code></code><br />
<code>CALL mydb.copySchema('mysql');</code></p></blockquote>
<p>Referências:</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html">Create Procedure</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/cursors.html">Cursors</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/sqlps.html">Prepared Statements</a></li>
</ul>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=67&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_67" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2008/01/09/mysql-clone-database-schema/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JBoss Portal default bind address (windows!)</title>
		<link>http://blogs.fe.up.pt/mpadilha/2007/12/30/jboss-portal-default-bind-address-windows/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2007/12/30/jboss-portal-default-bind-address-windows/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 03:04:20 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2007/12/30/jboss-portal-default-bind-address-windows/</guid>
		<description><![CDATA[Escrevi aqui sobre como alterar o default bind address do JBoss Portal. Apesar de não o ter dito explicitamente, as instruções aplicam-se exclusivamente a ambientes UNIX/Linux. Este artigo contém as instruções para a plataforma Windows.
Em Windows, o JBoss Portal instala-se como um serviço, recorrendo para isso a um script chamado:
installJBoss402.bat
Nesse script, a linha que efectivamente [...]]]></description>
			<content:encoded><![CDATA[<p>Escrevi <a href="http://blogs.fe.up.pt/mpadilha/2007/12/12/jboss-portal-default-bind-address/">aqui</a> sobre como alterar o <em>default bind address</em> do JBoss Portal. Apesar de não o ter dito explicitamente, as instruções aplicam-se exclusivamente a ambientes UNIX/Linux. Este artigo contém as instruções para a plataforma Windows.</p>
<p>Em Windows, o JBoss Portal instala-se como um serviço, recorrendo para isso a um script chamado:</p>
<blockquote><p><code>installJBoss402.bat</code></p></blockquote>
<p>Nesse script, a linha que efectivamente regista o serviço no Windows é a seguinte:</p>
<blockquote><p><code>JBossPortal262Service.exe -install %SERVICE_NAME% %JDK_HOME%\jre\bin\server\jvm.dll -Djava.class.path=%JBOSS_HOME%\run.jar;%JDK_HOME%\lib\tools.jar -Dlocal.copy=false -Xms256m -Xmx512m -XX:MaxPermSize=128m run.jar -start org.jboss.Main -stop org.jboss.Main -method systemExit -out %LOGS_HOME%\stdout.log -err %LOGS_HOME%\stderr.log -current %JBOSS_HOME% -manual</code></p></blockquote>
<p>Para conseguir trocar o <em>default bind address</em> é preciso passar a mesma propriedade que referi no artigo anterior à classe que arranca o JBoss. Isso pode ser feito modificando a linha anterior da seguinte forma:</p>
<blockquote><p><code>JBossPortal262Service.exe -install %SERVICE_NAME% %JDK_HOME%\jre\bin\server\jvm.dll -Djava.class.path=%JBOSS_HOME%\run.jar;%JDK_HOME%\lib\tools.jar -Dlocal.copy=false -Xms256m -Xmx512m -XX:MaxPermSize=128m run.jar -start org.jboss.Main <strong>-params -Djboss.bind.address=&lt;ip_address&gt;</strong> -stop org.jboss.Main -method systemExit -out %LOGS_HOME%\stdout.log -err %LOGS_HOME%\stderr.log -current %JBOSS_HOME% -manual</code></p></blockquote>
<p>A posição do parâmetro adicional é relevante! Deve aparecer imediatamente a seguir ao valor da opção <code>-start</code>.</p>
<p>A título de curiosidade, podem encontrar <a href="http://javaservice.objectweb.org/docs/devdocs/devcmds.html">aqui</a> uma lista de todos os parâmetros que controlam o funcionamento do <a href="http://forge.objectweb.org/projects/javaservice/">JavaService</a>.</p>
<p>Os créditos vão todos para o Manuel Costa que não desistiu enquanto não descobriu a solução correcta.</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=65&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_65" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2007/12/30/jboss-portal-default-bind-address-windows/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JBoss Portal default bind address</title>
		<link>http://blogs.fe.up.pt/mpadilha/2007/12/12/jboss-portal-default-bind-address/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2007/12/12/jboss-portal-default-bind-address/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 12:18:22 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2007/12/12/jboss-portal-default-bind-address/</guid>
		<description><![CDATA[Nas últimas versões, o JBoss Portal cria os conectores http(s) apenas na interface localhost. Isto serve perfeitamente para ambientes de desenvolvimento e para cenários em que o JBoss só vai ser exposto através de um reverse proxy que corre no mesmo servidor. No entanto, se se pretender expôr directamente o JBoss na rede é necessário [...]]]></description>
			<content:encoded><![CDATA[<p>Nas últimas versões, o <a href="http://www.jboss.org/products/jbossportal">JBoss Portal </a>cria os conectores http(s) apenas na interface localhost. Isto serve perfeitamente para ambientes de desenvolvimento e para cenários em que o JBoss só vai ser exposto através de um reverse proxy que corre no mesmo servidor. No entanto, se se pretender expôr directamente o JBoss na rede é necessário mudar este comportamento.</p>
<p> Os conectores são definidos em:</p>
<blockquote><p>JBOSS_HOME/server/default/deploy/jboss-web.deployer/server.xml</p></blockquote>
<p>e usam todos a variável:</p>
<blockquote><p>${jboss.bind.address}</p></blockquote>
<p>Há vários documentos (como por exemplo <a target="_blank" href="http://docs.jboss.org/jbportal/v2.4/reference-guide/en/html/configuration.html">este</a>) que sugerem substituir a variável directamente pelo IP pretendido. No entanto, esta variável é utilizada em muitos outros sítios (por exemplo pelo RMI e JNDI) e seria bem mais simples e limpo alterar a variável no arranque do servidor.</p>
<p>A primeira coisa que me ocorreu foi modificar o script de arranque:</p>
<blockquote><p>JBOSS_HOME/bin/run.sh</p></blockquote>
<p>acrescentando a seguinte linha:</p>
<blockquote><p>JAVA_OPTS=&#8221;$JAVA_OPTS -Djboss.bind.address=`hostname`&#8221;</p></blockquote>
<p>Mas não funcionou. A variável continuava a vir inicializada com o valor &#8220;localhost&#8221;.</p>
<p>Ao fim de muito procurar descobri <a href="http://jira.codehaus.org/browse/CARGO-405#action_73889">esta resposta</a> a um post. A única diferença entre o sugerido e aquilo que fiz, é que a definição da variável é passada como argumento ao script de arranque (que por sua vez a passa para o comando que é executado), em vez de ser definida em JAVA_OPTS e passada directamente à JVM.</p>
<p>Não percebo inteiramente porque é que isto funciona, por isso se alguém me souber explicar, agradeço!</p>
<p>Curiosidade: há um <a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=UsingPortForwardingWithJBoss">documento</a> no wiki do JBoss Portal que sugere e explicar como usar iptables para publicar o JBoss Portal!</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=62&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_62" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2007/12/12/jboss-portal-default-bind-address/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Dynamic Proxies</title>
		<link>http://blogs.fe.up.pt/mpadilha/2007/11/15/java-dynamic-proxies/</link>
		<comments>http://blogs.fe.up.pt/mpadilha/2007/11/15/java-dynamic-proxies/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 20:53:14 +0000</pubDate>
		<dc:creator>Manuel Padilha</dc:creator>
		
		<category><![CDATA[java]]></category>

		<category><![CDATA[open-source]]></category>

		<guid isPermaLink="false">http://blogs.fe.up.pt/mpadilha/2007/11/15/java-dynamic-proxies/</guid>
		<description><![CDATA[Antes de mais uma definição breve:
A dynamic proxy class is a class that implements a list of interfaces specified at runtime such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. [Sun]
A ideia já tem o seu [...]]]></description>
			<content:encoded><![CDATA[<p>Antes de mais uma definição breve:</p>
<blockquote><p>A dynamic proxy class is a class that implements a list of interfaces specified at runtime such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. <em>[<a href="http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html">Sun</a>]</em></p></blockquote>
<p>A ideia já tem o seu tempo e como seria de esperar existe um <em>pattern</em> na raíz de tudo isto:</p>
<blockquote><p>The Proxy pattern involves the creation of a &#8220;stub&#8221; or &#8220;surrogate&#8221; object, whose purpose is to accept requests and forward them to another object that actually does the work. [<em><a href="http://www.ibm.com/developerworks/java/library/j-jtp08305.html">IBM</a></em>]</p></blockquote>
<p>E para que é que isto serve? Isolamento pode ser uma razão, mas há outras utilizações possíveis, seja para <a href="http://www.webreference.com/internet/reflection/index.html">criar versões <em>traceable</em></a> de classes existentes, ou para <a href="http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html">introduzir strong typing</a> em tipos de dados abstractos, ou para <a href="http://labs.jboss.com/file-access/default/members/jbossas/freezone/docs/Server_Configuration_Guide/beta422/html/The_EJB_Client_Side_View-Specifying_the_EJB_Proxy_Configuration.html">certos containers</a> implementarem EJBs.</p>
<p>Bom proveito!</p>
<p class="akst_link"><a rel="nofollow" href="http://blogs.fe.up.pt/mpadilha/?p=38&amp;akst_action=share-this"  title="Enviar por email, adicionar ao del.icio.us, ..." id="akst_link_38" class="akst_share_link">Partilhar</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blogs.fe.up.pt/mpadilha/2007/11/15/java-dynamic-proxies/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
